//(eV)での解析は、x軸等間隔のデータに両軸とも焼きなおして利用してください。(2004.04.29) #pragma rtGlobals=1 // Use modern global access method. //////////////////////////////////////////////////////////////////////////////////////// //更新履歴 //2004.08.28 ver2.2としてリリース。面積も表示にしたときに、高さ×幅アルゴリズムと // 台形アルゴリズムにおける面積を履歴エリアに出力してくれる。高さ、位置、幅も // 同時に出力する。 // //2004.04.29 (eV)に対応。ただし、等間隔データが望ましい。操作パネルから参照が押されて // グラフ上から「取得」ボタンが押された際、自動的にnmデータかeVデータか判断し // 見合った半値幅を入力してくれる。さらに、積分値のアルゴリズムを2タイプ表示。 // 台形アルゴリズムでは表示範囲の面積を、高さ×幅アルゴリズムでは、ガウシアン // の係数から面積を算出。フィッティングの式で、定数1.665を正確な式2*sqrt(ln(2)) // で表現しなおした。バージョン2.1。 // //2003.08.28 積分値を計算するアルゴリズムを変更(凅をかけるようにした。台形アルゴリズム。) // 表示桁数を「0.12345」小数点以下5桁に変更 // (ver.2)としてリメイク。メニューをひらいた時にすぐにわかるよう、表示させた。 //2003.05.22 合計の積分値も表示させるように改訂 //2003.05.21 トップのメモ書きをわかりやすく更新 //2003.05.20 マクロ「Gaussian_kaiseki_menu_OPEN()」として、ガウシアン関数へ分解する作業 // の支援ツールをメニューバーとしてまとめた。@「ピーク検出」…panelAを開き、 // グラフから、ピークを参照していき、fwとして初期係数ウェーブを作成した後、 // フィッティングを施し、その係数ウェーブを名前をつけて保存できる、メインとな // るウィンドウ(パネル)を開く。A「表示」B「非表示」…保存された係数ウェー // ブ「cf_で始まる」より、分解後の表示・非表示を行う。C「パッキング」…一度に // 分解できなかったばあい、2つ以上の係数ウェーブをまとめてパッキングすること // ができる。以上の@〜Cの作業をメニューバーとしてまとめることで、「Gauss_ka // iseki」プロシージャーの一応の完成とする。 // //************************************************************************************** //////////////////////////////////////////////////////////////////////////////////////// //Gauss_kaiseki.ipf ReadMe //////////////////////////////////////////////////////////////////////////////////////// //************************************************************************************** //////////////////////////////////////////////////////////////////////////////////////// //ガウス関数に分解するためのツールをいくつか用意 //////////////////////////////////////////////////////////////////////////////////////// // @ 「ピーク検出」 // パネルAを作成するためのコマンドボタン。 // ガウシアン関数に分解したい範囲をカーソルで指定したのち、 // ボタンをおして、パネルAを作成する // // 注意: パネルが開いている間は、データフォルダ「POPEN」内での作業 // となる。「閉じる」・「保存」を押す(パネルを閉じる)と、中間生成 // ウェーブ・変数等はデータフォルダごと削除されるので、注意。 // // @-1「panelA」での作業 // 分解したい数だけチェックを入れる。 // ラジオボタンを押して、「参照」ボタンをおす。 // グラフのピーク頂点にカーソルAをあわせて「取得」ボタンを押す。 // 数値を適当に変更して、調節する。以上を繰り返す。 // ベース値を入力する。以上で初期係数の作成を終える。 // 次に、「Fitting」を押して、フィッティングさせる。 // うまくいかなければ、初期値を再編集して、繰り返し、最適な係数を得る。 // 「fw保存」をおして、名前をつけて保存して、「panelA」を閉じる。 // // 注意: 保存されたウェーブはデータファルダのルートに「cf_****_s***e***g*」 // の規格化された名前をつけて保存します。これにより、次の作業に // 必要な情報が適切に渡されることになります。でたらめに変更しないこと。 // // AB「表示・非表示」ボタン // 規格化保存された係数ウェーブ「cf_****」を読み出して、分解された形で表示する。 // 自動的に、表示のためのウェーブ「g1,g2,・・・・,gX,Spe,x1」を作成します。 // 「非表示」ぼたんで、分解されたガウシアン関数「g1,g2,・・,gX,Spe」を削除します。 // C「cf_パッキング」ボタン // panelBが開きます。 // 合成したいウェーブを選ぶ。 // 合成したあとのウェーブ名を入力します。 /////////////////////////////////////////////////////////////////////////////////////// //************************************************************************************* //////////////////////////////////////////////////////////////////////////////////////////////////// //************************************************************************************************// //* 解析メニューをグラフ上に作成するマクロ *// //************************************************************************************************// //////////////////////////////////////////////////////////////////////////////////////////////////// macro Gaussian_kaiseki_menu_OPEN() variable vv2 variable/G LN2=2*sqrt(ln(2)) vv2=kaiseki_menu_OPEN2() endmacro function kaiseki_menu_OPEN2() variable/G LN2=2*sqrt(ln(2)) //グラフ上部にメニューバーを配置する。 // //新規にメニューを作成する前に、グラフウィンドウから実行されているか調べる variable d d=wintype("") //ターゲットウィンドウの種類を取得→(=1)ならばグラフ if(d!=1) //グラフウィンドウから実行されていない。 print "error:グラフウィンドウを最前面に持ってきてもう一度実行してください。" else //次に「buttonA」が存在するか調べる string s2 s2=ControlNameList("") //ターゲットウィンドウの中からbuttonAの名前のコントロールをリストアップ d=strsearch(s2,"buttonA",0) //buttonAがあればd=>0、なければd==-1 if(d==-1) //「buttonA」が存在しないとき print "グラフ上部に「解析メニュー」を作成します。" ControlBar 18 //上部にコントロールを配置するスペースの作成 //「ver」値表示を配置 ValDisplay valdisp_ver pos={0,0},title="ver",value=2.2 //「ピーク検出」ボタンの配置 Button buttonA pos={50,0},size={80,18},proc=panel_Open3,title="ピーク検出" Button buttonA help={"ピーク検出パネルを開きます。ここで、ピーク値を取得することができます。必ずカーソルで範囲を指定してください。"} //「表示」ボタンの配置 Button button_read pos={130,0},size={80,18},proc=but_read_on,title="表示" Button button_read help={"規格化係数ウェーブ「cf_****」を選択して、分解されたガウシアン関数を表示させます。"} //「非表示」ボタンの配置 Button button_remove pos={210,0},size={80,18},proc=but_remove_on,title="非表示" Button button_remove help={"表示させた分解後のガウシアン関数を非表示にします。"} //「cf_結合」ボタンの配置 Button button_pack pos={290,0},size={80,18},proc=but_pack_on,title="cf_パッキング" Button button_pack help={"一度に分解できなかった「cf_***」をパッキングします。"} //「終了」ボタンの配置 Button button_close_menu pos={370,0},size={80,18},proc=but_close_menu_on,title="終了" Button button_close_menu help={"解析メニューを終了します。"} // //(2003.06.22)追加///////////////////////////////// ShowInfo //情報を表示 // else //buttonAが存在するとき print "すでにグラフ上にメニューバーが存在します。問題のグラフ上のメニューバーを一度終了させて、もう一度実行してください。" endif endif end //従属関数 function but_close_menu_on(ctrlName) : ButtonControl string ctrlName //「終了」ボタンが押されたとき,メニューを消す killcontrol valdisp_ver killcontrol buttonA killcontrol button_read killcontrol button_remove killcontrol button_pack killcontrol button_close_menu ControlBar 0 end function but_read_on(ctrlName) : ButtonControl string ctrlName //「表示」ボタンが押されたとき read_cf_XXX_gXX11() end function but_remove_on(ctrlName) : ButtonControl string ctrlName //「非表示」ボタンが押されたとき remove_gXX2() end function but_pack_on(ctrlName) : ButtonControl string ctrlName //「cf_パッキング」ボタンが押されたとき gauss_cf_packing2() end function menu_able(swit,winNam) variable swit //スイッチ、=1で、表示、=0で非表示 string winNam //ウィンドウネーム variable v1 //メニューの表示をコントロール if(swit==1) //表示 v1=0 endif if(swit==0) //非表示 v1=2 endif Button buttonA win=$winNam,disable=v1 Button button_read win=$winNam,disable=v1 Button button_remove win=$winNam,disable=v1 Button button_pack win=$winNam,disable=v1 Button button_close_menu win=$winNam,disable=v1 end //**************************************************************** //****************************************************************************************************** //以下フィッティング用の関数(2003.5.2) 編集:田中智 // 2003.5.13 ガウシアン関数1つと水平ベースライン1つの関数も追加 //****************************************************************************************************** Function linegauss(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return ( w[0]+w[1]*x+w[2]*exp(-((x-w[3])/w[4])^2)) End Function gauss1line1(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*x+w[4]) End Function gauss1(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]) End Function gauss2(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]) End Function gauss3(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]) End Function gauss4(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]*exp(-((x-w[10])/(w[11]/LN2))^2)+w[12]) End Function gauss6(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]*exp(-((x-w[10])/(w[11]/LN2))^2)+w[12]*exp(-((x-w[13])/(w[14]/LN2))^2)+w[15]*exp(-((x-w[16])/(w[17]/LN2))^2)+w[18]) End Function gauss5(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]*exp(-((x-w[10])/(w[11]/LN2))^2)+w[12]*exp(-((x-w[13])/(w[14]/LN2))^2)+w[15]) End Function gauss7(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]*exp(-((x-w[10])/(w[11]/LN2))^2)+w[12]*exp(-((x-w[13])/(w[14]/LN2))^2)+w[15]*exp(-((x-w[16])/(w[17]/LN2))^2)+w[18]*exp(-((x-w[19])/(w[20]/LN2))^2)+w[21]) End Function gauss8(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) return (w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]*exp(-((x-w[10])/(w[11]/LN2))^2)+w[12]*exp(-((x-w[13])/(w[14]/LN2))^2)+w[15]*exp(-((x-w[16])/(w[17]/LN2))^2)+w[18]*exp(-((x-w[19])/(w[20]/LN2))^2)+w[21]*exp(-((x-w[22])/(w[23]/LN2))^2)+w[24]) End Function gauss9(w, x) Wave w Variable x variable/G LN2=2*sqrt(ln(2)) variable p p=w[0]*exp(-((x-w[1])/(w[2]/LN2))^2)+w[3]*exp(-((x-w[4])/(w[5]/LN2))^2)+w[6]*exp(-((x-w[7])/(w[8]/LN2))^2)+w[9]*exp(-((x-w[10])/(w[11]/LN2))^2) p=p+w[12]*exp(-((x-w[13])/(w[14]/LN2))^2)+w[15]*exp(-((x-w[16])/(w[17]/LN2))^2)+w[18]*exp(-((x-w[19])/(w[20]/LN2))^2) p=p+w[21]*exp(-((x-w[22])/(w[23]/LN2))^2)+w[24] return (p) End //以上がフィッティング用関数の定義 //******************************************************************************************************** //以下表示させる関数 (2003.5.2) 編集:田中智 // 2003.5.12 致命的バグを回復(ベースを足し合わされて表示される) // ルートのデータフォルダでのみ動作することを確認 // 2003.5.14 cfで始まるウェーブを読み込めるように修正 //******************************************************************************************************** function read_cf_XXX_gXX11() //保存され、規格化された係数ウェーブ(例「cf_fileN_s345e366g6」)から表示を行う。 //保存され、規格化された係数ウェーブ名を読み込む string coefw1 prompt coefw1,"企画化された係数ウェーブ「cf_****_s***e***g**」を選択してください。", popup,wavelist("cf*",";","") string x_wl_name1 prompt x_wl_name1,"X軸にする、ウェーブを選択してください。",popup,wavelist("*",";","")+wavelist("copy_*",";","") variable swit=1 prompt swit,"積分値も表示しますか?(yes,no)",popup,"yes;no;" doprompt "規格化ウェーブより、グラフに分解されたガウシアン関数を表示する。",coefw1,x_wl_name1,swit //次の操作へ variable a a=read_cf_XXX_gXX2(coefw1,x_wl_name1,swit) end function read_cf_XXX_gXX2(cfw,x_wl_name,switn) string cfw //読み込まれたウェーブ名 string x_wl_name variable switn //積分値を表示するか(=1表示)(=0非表示) //ウェーブ名より情報を取得 variable p_max //ピークの数 //ウェーブの形が(3×n+1)の形になっているかどうか審査する wave ff=$cfw //係数ウェーブをウェーブとして認識 wave xww=$x_wl_name //xウェーブを認識 variable wavepointnum=numpnts(ff) //係数ウェーブのポイント数を取得 if(mod((wavepointnum-1),3)!=0) //係数ウェーブが規格外のとき print "error:フォーマットが違います。3×3+1の要素数のウェーブとしてください。" else p_max=(wavepointnum-1)/3 if(p_max>60) print "要素数が多すぎます(ピークが20個以上)。係数ウェーブでない可能性があります。" else print p_max,"個のガウシアン関数で分解した結果を表示します。" //使用するウェーブをそれぞれ認識していく make/D/O/N=(numpnts(xww)) x1,Spe //合成ウェーブと横軸ウェーブx1の作成 wave Sp=Spe //ウェーブとして認識 Sp=0 //初期化 wave x=x1 //////////////////////////////////////////////////////////////////////////////////////// //(2003.5.19追加) wave wl=$x_wl_name x=wl //ピークの数だけガウシアン関数をのせるウェーブを作る string ww //作成するウェーブ名を一時的に保持する文字変数 variable a1=1 //作成するウェーブの添え字(a1番目のピーク,例「g3」)を保持 do ww="g"+num2str(a1) make/D/O/N=(numpnts(xww)) $ww //「g1」から「ga1」までのウェーブを作成 wave w1=$ww //それぞれウェーブとして認識 w1=0 //初期化 a1=a1+1 while(a1<=p_max) //次にga1までのウェーブに計算値を入れていく string tgname variable sk_total variable a2 a1=1 do ww="g"+num2str(a1) wave w1=$ww //ウェーブ$wwをウェーブw1として認識 w1=0 //値をリセット w1=ff[(a1-1)*3]*exp(-((x-ff[(a1-1)*3+1])/(ff[(a1-1)*3+2]/(2*sqrt(ln(2)))))^2)+ff[p_max*3] Sp=w1+Sp-ff[p_max*3] //グラフに表示させるが、同じトレース名がある時、グラフからいったんそのトレースを削除させる a2=strsearch(tracenamelist("",";",1),ww,0) if(a2!=-1) //重複したときトレースをいったん削除 RemoveFromGraph/Z $ww print "すでに表示されています",ww endif //最前面のグラフに表示させる AppendToGraph/C=(0,0,65535) w1 vs x //積分の追加(2003.5.20追加)////////////////////////////////////////////// if(switn==1) //積分を行い、テーブルに表示させる variable v1=1 variable sekibunti=0 do sekibunti=sekibunti+(w1[v1]+w1[v1+1]-2*ff[p_max*3])*(x[v1+1]-x[v1])/2 //-ff[p_max*3] v1=v1+1 while(v1<=(numpnts(xww))) //sekibunti=sekibunti-ff[p_max*3]*(x[2]-x[1])*numpnts(xww) //"掛け算アルゴリズム" variable sekibunti2=0 sekibunti2=ff[(a1-1)*3]*ff[(a1-1)*3+2]*sqrt(pi)*(1/(2*sqrt(ln(2)))) sk_total=sk_total+sekibunti2 print ww,"台形アルゴリズム",sekibunti,"高さ×幅アルゴリズム",sekibunti2,"高さ=",ff[(a1-1)*3],"位置=",ff[(a1-1)*3+1],"幅=",ff[(a1-1)*3+2] endif ///////////////////////////////////////////////////////////////////////// //タグの表示(2003.05.18追加)////////////////////////////////////////////// tgname="tag"+num2str(a1) if(switn==1) string tx1 //(2003.08.28)変更/////////////////////////////////////////////////////////////// tx1=gosub_fff(sekibunti) //「5111.43212(数値)」→「5511.1(テキスト)」に変換変換する //sprintf tx1,"%#.*f" 1,sekibunti string text="\JCg"+num2str(a1)+"\r\Z08"+tx1 tag/c/n=$tgname/l=2/X=0.00/Y=20.00 $ww,Xwave_to_MmPnum(ww),text else tag/c/n=$tgname/l=2/X=0.00/Y=20.00 $ww,Xwave_to_MmPnum(ww),"\JCg"+num2str(a1) endif a1=a1+1 while(a1<=p_max) //Speを完成させて、表示させる Sp=Sp+ff[p_max*3] a2=strsearch(tracenamelist("",";",1),"Spe",0) if(a2!=-1) //重複したときにトレースをいったん削除させる RemoveFromGraph/Z Spe print "すでに表示されています","Spe" endif AppendToGraph/C=(0,0,65535) Sp vs x //表示させる //積分の追加(2003.5.22追加)////////////////////////////////////////////// if(switn==1) //積分を行い、テーブルに表示させる //variable v1=1 //variable sekibunti=0 v1=1 do sekibunti=sekibunti+(Sp[v1]+Sp[v1+1]-2*ff[p_max*3])*(x[v1+1]-x[v1])/2 //-ff[p_max*3]*(x[v1+1]-x[v1]) v1=v1+1 while(v1<=(numpnts(xww))) //sekibunti=sekibunti-ff[p_max*3]*(x[v1+1]-x[v1])*numpnts(xww) print "Spe","台形アルゴリズム",sekibunti,"高さ×幅アルゴリズム",sk_total endif ///////////////////////////////////////////////////////////////////////// //Speタグの表示(2003.05.22追加)////////////////////////////////////////////// tgname="tag"+"Spe" if(switn==1) //string tx1 //(2003.08.28変更)/////////////////////////////////////// tx1=gosub_fff(sekibunti) //sprintf tx1,"%#.*f" 1,sekibunti //string text="\JCSpe"+"\r\Z08"+tx1 tag/c/n=$tgname/l=2/X=0.00/Y=20.00 Spe,Xwave_to_MmPnum("Spe"),text else tag/c/n=$tgname/l=2/X=0.00/Y=20.00 Spe,Xwave_to_MmPnum("Spe"),"\JCSpe" endif endif endif return 0 end //従属関数 function Xwave_to_MmPnum(x_wavename) //X軸に使用されているウェーブにおける最大値もしくは最小値をもつポイントナンバーを返す //(2003.5.18追加) string x_wavename //使用されるx軸のウェーブ名 wave x1=$x_wavename wavestats/q x1 variable tempnum,return_num //print V_max,V_min, V_maxloc,V_minloc tempnum=max(abs(V_max),abs(V_min)) if(tempnum==abs(V_max)) return_num=V_maxloc endif if(tempnum==abs(V_min)) return_num=V_minloc endif return return_num end //積分 function sekibun_2003_5_20(p_max_num) string p_max_num //ピークの総数 end //数値データを表示させる形式にフォーマットさせる(2003.08.28追加) function/S gosub_fff(vs1) variable vs1 string stout string st2=num2istr(vs1) variable v2=str2num(st2) variable st1=strlen(st2) //print vs1,v2,st1 if(st1>7) sprintf stout,"%g",vs1 elseif(st1>5) stout=num2istr(vs1) elseif(st1>1) sprintf stout,"%#.*f" 5,vs1 else if(v2==0) sprintf stout,"%g",vs1 else sprintf stout,"%g",vs1 endif endif return stout end //********************************************************************************** //表示されたガウス関数を非表示にするマクロ (2003.5.2) 編集:田中智 // (2003.5.19) 表示に使用したウェーブをすべて破棄するように変更 //********************************************************************************** function remove_gXX2() //まずSpeから消す variable a2 a2=strsearch(tracenamelist("",";",1),"Spe",0) if(a2!=-1) //Speがトレースされている場合 RemoveFromGraph/Z Spe printf "Spe," endif //次にg*のウェーブが何番目までトレースされているか調べる variable a3=1 variable a4 string s1 do s1="g"+num2str(a3) a2=strsearch(tracenamelist("",";",1),s1,0) if(a2!=-1) //存在するとき RemoveFromGraph/Z $s1 printf "%s,",s1 a4=a3 endif a3=a3+1 while(a3<100) if(a4!=0) print " の表示を消しました。" endif //以下追加コマンド 表示に使用したウェーブは削除する if(strsearch(WaveList("Spe",";",""),"Spe",0)!=-1) //Speが現在のデータフォルダに存在するとき killwaves/Z Spe endif a3=1 do s1="g"+num2str(a3) if(strsearch(WaveList("g*",";",""),s1,0)!=-1) killwaves/Z $s1 endif a3=a3+1 while(a3<100) killwaves/Z x1 end //************************************************************************************************ //パネルA(ピーク検出ウィンドウ)を開きます //************************************************************************************************ function panel_Open2() //新規にボタンを作成する前に、グラフウィンドウから実行されているか調べる variable d d=wintype("") //ターゲットウィンドウの種類を取得→(=1)ならばグラフ if(d!=1) //グラフウィンドウから実行されていない。 print "error:グラフウィンドウを最前面に持ってきてもう一度実行してください。" else //次に「buttonA」が存在するか調べる string s2 s2=ControlNameList("") //ターゲットウィンドウの中からbuttonAの名前のコントロールをリストアップ d=strsearch(s2,"buttonA",0) //buttonAがあればd=>0、なければd==-1 if(d==-1) //buttonAが存在しないとき print "「buttonA」を作成します。" else //buttonAが存在するとき KillControl buttonA print "「buttonA」が存在したのでいったん削除して、作成しました。" endif //ボタンを作成します。 //クリックされるとpanel_Opne3()関数が起動します。 Button buttonA pos={200,20},size={80,18},proc=panel_Open3,title="ピーク検出";DelayUpdate Button buttonA help={"ピーク検出パネルを開きます。ここで、ピーク値を取得することができます。必ずカーソルで範囲を指定してください。"} endif end //****************************************************************************************************************************** function panel_Open3(ctrName) : ButtonControl //グラフ中の「ピーク検出」ボタンより呼び出されて、パネルを作成する関数 string ctrName print ctrName //まず、カーソルA、カーソルBがあるかどうか調べる。なければ注意、あれば続行 string s1,s2 variable v1=0 s1=csrwave(A) //ターゲットウィンドウのグラフにおいてカーソルAの乗っているウェーブ名を取得 s2=csrwave(B) //カーソルBの乗っているウェーブ名を取得。カーソルが存在しなければ、ヌルを返す。 if(strlen(s1)==0) v1=-1 endif if(strlen(s2)==0) v1=-1 endif //どちらかのカーソルが存在しなければ、キャンセルする。 if(v1==-1) print "error:カーソルが置かれていません。" else variable d //次に「panelA」が存在するか調べる d=strlen(winlist("panelA",";","WIN:64")) //パネルウィンドウの中からpanelAの名前のウィンドウをリストアップする。 if(d==0) //panelAが存在しないとき //さらに「panelB」が存在しないか調べる if(strlen(winlist("panelB",";","WIN:64"))==0) //「panelB」が存在しないとき print "「panelA」を作成します。" panel_Open4() //次の作業へ else print "error:「panelB」ウィンドウが開いてます。一度閉じてからやり直してください。" endif else //panelAが存在するとき //dowindow/k panelA print "error:「ピーク検出」ウィンドウが開いてます。一度閉じてからやり直してください。" DoWindow/F panelA endif //以上で確認作業終わり。以下パネルの作成 endif end function panel_Open4() //「panelA」を作成します。k=2(ウィンドウの破棄は無効) //その前に ///「ピーク検出」ボタンを選択不可にする Button buttonA,disable=2,help={"選択不可"},title="検出中" //その他のボタンも選択不可にする menu_able(0,WinName(0,1)) //「panelA」の作成 newpanel/k=2/W=(174,47.75,503.25,590) as "panelA:ピークを検出します。" DoWindow/C panelA // Target window (panel1) renamed panelA. //説明文を4行にわたり載せる titlebox tib0,title="カーソルの範囲内にあるピークの数だけチェックを入れる。",frame=0,pos={30,5} titlebox tib1,title="次に、入力したいピークのラジオボタンを選択。",frame=0,pos={30,20} titlebox tib2,title="次に、「参照」ボタンを押してグラフに移動。",frame=0,pos={30,35} titlebox tib3,title="ピークの頂点にカーソルAを移動し、「取得」を押す。",frame=0,pos={30,50} titlebox tib55,title="すべて入力が完了したら、「Fitting」を押し、fittingする。",frame=0,pos={30,65} titlebox tib54,title="正しい近似が完了したら「fwを保存」を押して、閉じる。",frame=0,pos={30,80} //カーソル範囲と「閉じる」ボタン、「参照」ボタンの表示 DrawLine 30,100,300,100 titlebox tib4,title="カーソル範囲",frame=0,pos={20,108} Valdisplay valdisp01 pos={90,105},frame=0,value=pcsr(A),size={40,15} titlebox tib5,title="〜",frame=0,pos={135,108} Valdisplay valdisp02 pos={150,105},frame=0,value=pcsr(B),size={40,15} //ボタンの表示 Button button_exit,pos={200,105},size={50,15},proc=ButtonProc_close_panelA,title="閉じる" Button button_exit,help={"このウィンドウを閉じます。"} Button button_get,pos={250,105},size={50,15},proc=But_Pro_get,title="参照",disable=2 Button button_get,help={"グラフウィンドウに戻り、値を取得します。"} DrawLine 30,125,300,125 //pointNum,top,position,widthの表示 titlebox tib6,title="point",frame=0,pos={90,135} titlebox tib7,title="topInt",frame=0,pos={140,135} titlebox tib8,title="position",frame=0,pos={200,135} titlebox tib9,title="width",frame=0,pos={260,135} //第1〜第9ピークの表示 //ループでコントロールを並べる variable vn1=1 //ループ変数 string cbx1,cbx2,tibxx,tit,v_point,v_topIn,v_posit,v_width //コントロール名保持変数 string g_val0,g_val1,g_val2,g_val3 //グローバル変数に用いる名前を保持する変数 do //名前の入力 cbx1="cbox"+num2str(vn1)+"a" cbx2="cbox"+num2str(vn1)+"b" tibxx="tib"+num2str(vn1+12) tit="N.O."+num2str(vn1) v_point="Sval"+num2str(vn1)+"_point" v_topIn="Sval"+num2str(vn1)+"_topIn" v_posit="Sval"+num2str(vn1)+"_posit" v_width="Sval"+num2str(vn1)+"_width" //グローバル変数に用いる名前を保持する変数 g_val0="gv"+num2str(vn1)+"_point" g_val1="gvv"+num2str(3*(vn1-1)+1) g_val2="gvv"+num2str(3*(vn1-1)+2) g_val3="gvv"+num2str(3*(vn1-1)+3) ////グローバル変数を宣言。ただしデータフォルダ「root:POPEN」に作成 ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// newdatafolder/O/S root:POPEN //データフォルダの作成 /O上書き、/S現在のデータフォルダとして移行// ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// variable/g root:POPEN:$g_val0=0 variable/g root:POPEN:$g_val1=0 //グローバル変数宣言 variable/g root:POPEN:$g_val2=0 variable/g root:POPEN:$g_val3=0 checkbox $cbx1,pos={10,130+(20*vn1)},title="",proc=cBox_on checkbox $cbx2,pos={30,130+(20*vn1)},title="",proc=crBox_on,mode=1,disable=2 titlebox $tibxx,title=tit,frame=0,pos={50,130+(20*vn1)} SetVariable $v_point pos={ 90,130+(20*vn1)},limits={-1,inf,0},frame=0,size={30,15},disable=2,title=" ",noproc SetVariable $v_topIn pos={140,130+(20*vn1)},limits={-inf,inf,0},frame=0,size={50,15},disable=2,title=" " SetVariable $v_posit pos={200,130+(20*vn1)},limits={-inf,inf,0},frame=0,size={50,15},disable=2,title=" " SetVariable $v_width pos={260,130+(20*vn1)},limits={-inf,inf,0},frame=0,size={50,15},disable=2,title=" " SetVariable $v_point labelBack=(60416,59648,55296),disable=0,noedit=1,value=$g_val0 SetVariable $v_topIn labelBack=(60416,59648,55296),disable=0,noedit=1,value=$g_val1 SetVariable $v_posit labelBack=(60416,59648,55296),disable=0,noedit=1,value=$g_val2 SetVariable $v_width labelBack=(60416,59648,55296),disable=0,noedit=1,value=$g_val3 vn1=vn1+1 while(vn1<=9) //(2003.5.19追加)///////////////////////////////最初の時点で非表示のボタン作成///////////////////////////// //「Fitting」ボタンを作成 button button_make_fw win=panelA,title="Fitting",pos={190,350},size={50,18},proc=make_fw,disable=2 //「cf_**読み込み」ボタン作成 Button button_load,pos={190,130+(20*12)},size={110,18},proc=But_load,title="cf_ウェーブ読み込み",disable=0 Button button_load,help={"保存された「cf_***」で規格化されたデータを読み込みます。"} //「ベース値」可変表示窓を作成する SetVariable ctrBase win=panelA,title="ベース値",pos={50,350},limits={-inf,inf,0},frame=1 SetVariable ctrBase win=panelA,size={100,16},disable=2 SetVariable ctrBase win=panelA,labelBack=(60416,59648,55296),noedit=0,value=base //ベースを保持するかどうかチェックボタンを追加する variable/G base_checked_pre=0 //記憶用 variable/G base_checked=0 checkbox rbox_baseOn,pos={50,370},title="値を保持する",proc=rboxbaseOnOff,mode=0,disable=2 //「軽く表示する」ボタンを追加する //(2003.5.19) Button but_visble,pos={190,390},size={50,18},proc=But_visble,title="表示",disable=2 Button but_visble,help={"参照のため、軽く表示します。"} //「fw保存」ボタンを配置 button button_save_fw win=panelA,title="fw保存",pos={250,350},size={50,18},proc=save_fw,disable=2 //「非表示」ボタンを作成 Button but_disvisble,pos={240,390},size={60,18},proc=But_Proc_disvisble,title="非表示",disable=2 Button but_disvisble,help={"参照のために表示した、分解後のガウシアン関数を非表示にする。"} //以上パネルの見た目の作成を終わり/////////////////////////////////////////////////////////////////////////// //最後に //呼び出された元のウィンドウ名、カーソルのあるywave名、xwave名をグローバル変数に保存しておく string/G gwname=WinName(0,1) string/G yWavName=csrwave(A,gwname) string/G xWavName=csrxwave(A,gwname) //ついでに、x,yのコピーウェーブをPOPENデータフォルダ内に作成しておく string xwave="copy_"+xWavName string ywave="copy_"+yWavName Duplicate/O CsrXWaveRef(A,gwname) $xwave Duplicate/O CsrWaveRef(A,gwname) $ywave ////カーソルA、Bを記憶する variable/G pA,pB //pointをグローバル変数で記憶 pA=pcsr(A,gwname) pB=pcsr(B,gwname) end //******************************************************************************************************************* Function ButtonProc_close_panelA(ctrlName) : ButtonControl //「閉じる」コントロールボタンの処理 String ctrlName dowindow/k panelA //パネルAを削除 print "「panelA」を削除しました。" string/g gwname //操作対象のグラフウィンドウ名を取得 //gwname=WinName(0,1) //「ピーク検出」ボタンに戻す Button buttonA win=$gwname,help={"ピーク検出パネルを開きます。ここで、ピーク値を取得することができます。必ずカーソルで範囲を指定してください。"} Button buttonA win=$gwname,disable=0,title="ピーク検出" //その他のボタンも選択可能にする menu_able(1,gwname) //タグの削除 variable v1=1 string tgname do tgname="tag"+num2str(v1) if(FindListItem(tgname,AnnotationList(gwname))!=-1) tag/w=$gwname/k/n=$tgname endif v1=v1+1 while(v1<=10) //「取得」ボタンがあれば削除する ControlInfo /W=$gwname but_G if(V_Flag!=0) KillControl/w=$gwname but_G endif //範囲を描いたウェーブ(ww11y,ww12y,ww21y,ww22y)をあれば削除 RemoveFromGraph ww11y,ww12y,ww21y,ww22y RemoveFromGraph/W=$gwname/Z ww11y,ww12y,ww21y,ww22y killwaves/Z ww11y,ww12y,ww21y,ww22y remove_gXX2() //g1~gX,Spe,x1の削除 ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// killdatafolder root:POPEN //データフォルダPOPENを削除 /////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// End //******************************************************************************************************************** function cBox_on(ctrlName,checked) : CheckBoxControl //チェックボックス・コントロールの処理 String ctrlName //チェックされたコントロールの名前 Variable checked //1=チェック、0=ノンチェック //ctrlnameから何番目のチェックボックスがチェックされたか抜き取る variable vn1 vn1=str2num(ctrlname[4]) //次に、とりあえずその行のコントロールの名前を取得する string cbx2,v_point,v_topIn,v_posit,v_width //コントロール名保持変数 //名前の取得 cbx2="cbox"+num2str(vn1)+"b" v_point="Sval"+num2str(vn1)+"_point" v_topIn="Sval"+num2str(vn1)+"_topIn" v_posit="Sval"+num2str(vn1)+"_posit" v_width="Sval"+num2str(vn1)+"_width" //分岐 if(checked==1) //チェックされた時、背景色を白に、ラジオボタンを有効に checkbox $cbx2 disable=0 SetVariable $v_point frame=0,labelBack=(65535,65535,65535) SetVariable $v_topIn frame=0,labelBack=(65535,65535,65535) SetVariable $v_posit frame=0,labelBack=(65535,65535,65535) SetVariable $v_width frame=0,labelBack=(65535,65535,65535) else if(checked==0) //チェックをはずされた時、 //可変表示窓の値を「0」にリセット reset_gv_gvv(vn1) //フレームなし。背景色をねずみ色。 SetVariable $v_point frame=0,labelBack=(60416,59648,55296) SetVariable $v_topIn frame=0,labelBack=(60416,59648,55296),noedit=1 SetVariable $v_posit frame=0,labelBack=(60416,59648,55296),noedit=1 SetVariable $v_width frame=0,labelBack=(60416,59648,55296),noedit=1 //もし、ラジオボタンがonになっていたら、offにすると同時に、「参照」ボタンを選択不可にする if(check_ctr(cbx2)==1) Button button_get,disable=2 endif checkbox $cbx2 disable=2,value=0 //value=0はチェックを解除し、v=1はチェックを有効にします。 else print "error:" endif endif end //従属関数↓ function reset_gv_gvv(vn1) //選択行の数値をリセット variable vn1 string g_val0,g_val1,g_val2,g_val3 //グローバル変数に用いる名前を保持する変数 g_val0="gv"+num2str(vn1)+"_point" g_val1="gvv"+num2str(3*(vn1-1)+1) g_val2="gvv"+num2str(3*(vn1-1)+2) g_val3="gvv"+num2str(3*(vn1-1)+3) // variable/g root:POPEN:$g_val0=0 variable/g root:POPEN:$g_val1=0 //グローバル変数宣言&リセット variable/g root:POPEN:$g_val2=0 variable/g root:POPEN:$g_val3=0 end function check_ctr(s1) //最前面のコントロールの情報を参照して、 //チェックボックス(ラジオボタン)の状態がon(=1)off(=0)を返す string s1 variable v1 ControlInfo $s1 v1=V_Value return v1 end //****************************************************************************************************************** function crBox_on(ctrlName,checked) : CheckBoxControl //ラジオボタンコントロールが押された時の処理(ラジオボタンはONのみの操作) String ctrlName //チェックされたコントロールの名前 Variable checked //1=チェック、0=ノンチェック //ctrlnameから何番目のチェックボックスがチェックされたか抜き取る variable vn1 vn1=str2num(ctrlname[4]) print vn1 //次に、コントロールの名前を一時保存する変数を作成 string cbx2,v_topIn,v_posit,v_width //コントロール名保持変数 variable v1=1 //ループ変数 do //選択された行、それ以外の行で作業の分岐 if(vn1==v1) //編集行 cbx2="cbox"+num2str(v1)+"b" v_topIn="Sval"+num2str(v1)+"_topIn" v_posit="Sval"+num2str(v1)+"_posit" v_width="Sval"+num2str(v1)+"_width" checkbox $cbx2 value=1 //value=0はチェックを解除し、v=1はチェックを有効にします。 SetVariable $v_topIn frame=1,noedit=0 ,disable=0//フレーム表示して、編集可能にする SetVariable $v_posit frame=1,noedit=0,disable=0 SetVariable $v_width frame=1,noedit=0,disable=0 Button button_get,disable=0 //「参照」ボタンが押せるようになる else //それ以外の行 cbx2="cbox"+num2str(v1)+"b" v_topIn="Sval"+num2str(v1)+"_topIn" v_posit="Sval"+num2str(v1)+"_posit" v_width="Sval"+num2str(v1)+"_width" checkbox $cbx2 value=0 //value=0はチェックを解除し、v=1はチェックを有効にします。 SetVariable $v_topIn frame=0,noedit=1 //フレーム非表示にして、編集不可能にする SetVariable $v_posit frame=0,noedit=1 SetVariable $v_width frame=0,noedit=1 endif v1=v1+1 while(v1<10) //選択中のラジオボタンの行番号をグローバル変数で保存しておく variable/g gv_now_edit=vn1 end //******************************************************************************************************** function But_load(ctrlName) : ButtonControl //panelAより「cf_ウェーブ読み込み」ボタンが押されたときの処理 string ctrlName //まず、カレントデータフォルダをroot:にする ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// SetDataFolder root: //カレントデータフォルダをroot:に設定 //////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// string load_cfwavename //読み込まれるウェーブ名 prompt load_cfwavename,"企画化された係数ウェーブ「cf_****_s***e***g**」を選択してください。", popup,wavelist("cf*",";","")+wavelist("fw*",";","") doprompt "係数ウェーブの読み込み",load_cfwavename if(V_flag==1) print "error:ユーザーによりキャンセルされました。" else //まづ、読み込まれたデータがきちんとした、規格になっているか確認 //ウェーブの形が(3×n+1)の形になっているかどうか審査する wave cfw=$load_cfwavename //ウェーブとして認識 variable p_max //ピークの数 variable wavepointnum=numpnts(cfw) //係数ウェーブのポイント数を取得 if(mod((wavepointnum-1),3)!=0) //係数ウェーブが規格外のとき print "error:フォーマットが違います。3×3+1の要素数のウェーブとしてください。" else p_max=(wavepointnum-1)/3 if(p_max>9) print "要素数が多すぎます(ピークが10個以上)。ピークが9つ以上の係数は読み込めません。" else print p_max,"個のガウシアン関数で分解したデータを読み込みます。" //具体的作業に //fwにコピーする //コピーする前に消す killwaves/Z fw //POPENデータフォルダにコピーする duplicate/O cfw,root:POPEN:fw //POPENデータフォルダに移動 ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// SetDataFolder root:POPEN //カレントデータフォルダをroot:POPENに設定 //////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// //要素数から、使用するグローバル変数を宣言&代入 wave w1=fw variable peeks=((numpnts(cfw)-1)/3) //ピークの数を保存 //ピーク番号のチェックをピークの数文だけ入れていく variable v1=1 string s1 do s1="cbox"+num2str(v1)+"a" cBox_on(s1,1) v1=v1+1 while(v1<=peeks) //次に変数に代入していく //グローバル変数に用いる名前を保持する変数 string g_val0,g_val1,g_val2,g_val3 v1=1 do g_val0="gv"+num2str(v1)+"_point" g_val1="gvv"+num2str(3*(v1-1)+1) g_val2="gvv"+num2str(3*(v1-1)+2) g_val3="gvv"+num2str(3*(v1-1)+3) //読み込み variable/g root:POPEN:$g_val0=0 variable/g root:POPEN:$g_val1=w1[3*(v1-1)+0] //グローバル変数宣言 variable/g root:POPEN:$g_val2=w1[3*(v1-1)+1] variable/g root:POPEN:$g_val3=w1[3*(v1-1)+2] v1=v1+1 while(v1<=peeks) //最後、ベース値を読み取る g_val0="gvv"+num2str(3*peeks+1) variable/G root:POPEN:base=w1[3*(peeks-1)+3] //グローバル変数宣言 //「Fitting」ボタンの表示 //「Fitting」ボタンをpanelAに作成する button button_make_fw win=panelA,disable=0 //「ベース値」可変表示窓を作成する SetVariable ctrBase win=panelA,disable=0,labelBack=(60416,59648,55296),noedit=0,value=base //(2003.5.19追加) //ベースを保持するかどうかチェックボタンを追加する checkbox rbox_baseOn,win=panelA,disable=0 //「軽く表示する」ボタンを追加する Button but_visble,win=panelA,disable=0 endif endif endif //「フィッティング時のエラー」に関する注意書きをしたためる。 doAlert 0,"読み込んだだけでは「Fitting」できません。チェックボックスに必要な数のチェックを入れてください。" //最後、カレントデータフォルダをroot:POPENに設定して終了 ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// SetDataFolder root:POPEN //カレントデータフォルダをroot:POPENに設定 //////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// end //************************************************************************************************************************* function But_visble(ctrlName) : ButtonControl //panelA「表示」が押されたときの処理 string ctrlName string/G xWavName string xwave="copy_"+xWavName read_cf_XXX_gXX2("fw",xwave,0) //panelA「非表示」ボタンを作成 Button but_disvisble,pos={240,390},size={60,18},proc=But_Proc_disvisble,title="非表示",disable=0 Button but_disvisble,help={"参照のために表示した、分解後のガウシアン関数を非表示にする。"} end function But_Proc_disvisble(ctrlName) : ButtonControl //panelA「非表示」が押されたときの処理 string ctrlName remove_gXX2() end //********************************************************************************************************************* function But_Pro_Get(ctrlName) : ButtonControl //panelAより「参照」がおされたときの処理 string ctrlName //panelAが呼び出されたグラフウィンドウを最前面(ターゲットウィンドウ)にする //「取得」ボタンを配置 //カーソルA、Bのpointを記憶して、Bは消す //カーソルAをピーク位置にユーザーにおいてもらう //「panelA」のコントロール群を選択、変更不可にする Button button_get title="参照中",disable=2 //参照ボタンが押せないようにする //visible(0) //新しく変更した↓ panelA_able(0) //グラフウィンドウを最前面へ string gwname gwname=winName(0,1) dowindow/f $gwname //「取得」ボタンの配置 Button but_G disable=0,help={"ピーク位置をカーソルから取得します。ピーク検出ウィンドウへを開きます。"} Button but_G pos={50,36},size={50,18},proc=get_p,title="取り込み" //説明文章の表示 titlebox tib_exp1,frame=0,pos={50,18},title="ピーク位置にカーソルAを移動。そのあと「取得」ボタンをおして、" titlebox tib_exp2,frame=0,pos={350,18},title="ピーク検出ウィンドウに戻る" //カーソルA、Bを記憶する variable/G pA,pB //pointをグローバル変数でpanelAが開かれるときに記憶したものを呼び出す string/G xWavName string xwavn="copy_"+xWavName wave xw1=$xwavn variable xA=xw1[pA] Variable xB =xw1[pB]//x座標を記憶 //cursor/p/m/k B //カーソルBの削除 string tname=CsrWave(A) variable pointnum=round((pA+pB)/2) //カーソル間の中央のポイント数を計算 print tname,pointnum cursor/p/w=$gwname A $tname pointnum //カーソルAを中央に置く //範囲を描写 set_vis(1,xA,xB) // end //従属関数 function set_vis(swit,xA,xB) //カーソルの外を領域外として、黒塗りします variable swit //スイッチ。=1で描写。=0で解除 variable xA //カーソルAのX座標。 variable xB //カーソルBのX座標。 string gwname //作業中のウィンドウ名を取得 gwname=winName(0,1) if(swit==1) //黒塗り描写用のウェーブを作成 make/D/O/N=2 ww11y,ww12y,ww1x,ww21y,ww22y,ww2x wave w11y=ww11y wave w12y=ww12y wave w1x=ww1x wave w21y=ww21y wave w22y=ww22y wave w2x=ww2x //カーソルAの乗っているウェーブ名のXウェーブ自身をwxウェーブとして認識する wave wx=CsrXWaveRef(A,gwname) //それぞれの黒描写ウェーブの数値を入力 w11y=inf w12y=-inf w1x[0]=wx[0] w1x[1]=xA w21y=inf w22y=-inf w2x[0]=xB w2x[1]=wx[numpnts(wx)] //グラフに追加 appendtograph/w=$gwname w11y,w12y vs w1x appendtograph/w=$gwname w21y,w22y vs w2x ModifyGraph mode(ww11y)=7,hbFill(ww11y)=14,rgb(ww11y)=(1792,1792,0) ModifyGraph mode(ww12y)=7,hbFill(ww12y)=14,rgb(ww12y)=(1792,1792,0) ModifyGraph mode(ww21y)=7,hbFill(ww21y)=14,rgb(ww21y)=(1792,1792,0) ModifyGraph mode(ww22y)=7,hbFill(ww22y)=14,rgb(ww22y)=(1792,1792,0) endif if(swit==0) RemoveFromGraph ww11y,ww12y,ww21y,ww22y endif end function panelA_able(switch1) variable switch1 //(=1)表示、(=0)非表示 variable v1 //switch1が1ならパネルAにあるボタン群を表示して、0で「閉じる」以外を非表示にする if(switch1==1) v1=0 endif if(switch1==0) v1=2 endif button button_get disable=v1 //「参照」 SetVariable ctrBase disable=v1 //「ベース値」 Button button_make_fw disable=v1 //「Fitting」 Button button_save_fw disable=v1 //「fw保存」 Button button_load disable=v1 //「cf_ウェーブ読み込み」 Button but_visble disable=v1 //「表示」 Button but_disvisble disable=v1 //「非表示」 CheckBox rbox_baseOn disable=v1 //「値を保持する」 button button_exit disable=0 //「閉じる」は常に表示 //以前の処理 //ボタンの表示 Button button_exit Button button_get variable vn1=1 //ループ変数 string cbx1,cbx2,tibxx,tit,v_point,v_topIn,v_posit,v_width //コントロール名保持変数 do //名前の入力 cbx1="cbox"+num2str(vn1)+"a" cbx2="cbox"+num2str(vn1)+"b" tibxx="tib"+num2str(vn1+12) tit="N.O."+num2str(vn1) v_point="Sval"+num2str(vn1)+"_point" v_topIn="Sval"+num2str(vn1)+"_topIn" v_posit="Sval"+num2str(vn1)+"_posit" v_width="Sval"+num2str(vn1)+"_width" if(switch1==0) //非表示にする checkbox $cbx1,disable=2 checkbox $cbx2,disable=2 SetVariable $v_topIn disable=2 SetVariable $v_posit disable=2 SetVariable $v_width disable=2 endif if(switch1==1) //表示にする checkbox $cbx1,disable=0 //とりあえずチェックボックスはすべて表示にする //チェックボックスがonかどうか調べる if(check_ctr(cbx1)==1) //onのとき checkbox $cbx2,disable=0 //ラジオボタンの表示をもとにもどす //ラジオボタンがチェックされている時 if(check_ctr(cbx2)==1) SetVariable $v_topIn disable=0 //可変窓の入力を許す SetVariable $v_posit disable=0 SetVariable $v_width disable=0 else SetVariable $v_topIn disable=2 //可変窓の入力を不許可 SetVariable $v_posit disable=2 SetVariable $v_width disable=2 endif endif endif vn1=vn1+1 while(vn1<=9) end function visible(v1) variable v1 //panelAのコントロール群の表示を制御 end //********************************************************************************************************************* function get_p(ctrlName) : buttoncontrol //グラフウィンドウより「取得」ぼたんが押された時の処理 string ctrlName //使用するグローバル変数をとりあえず宣言 string/G gwname //編集中のグラフ名 variable/g pA //カーソルAのポイント番号 variable/g pB //カーソルB variable/g gv_now_edit //現在ピーク位置参照中の行=ピーク番号 string tname=CsrWave(A) //カーソルAの乗っていたトレースのyウェーブ名 variable vn1 vn1=gv_now_edit //ピーク値、ピーク位置を取得する string g_val0,g_val1,g_val2,g_val3 //グローバル変数に用いる名前を保持する変数 g_val0="gv"+num2str(vn1)+"_point" g_val1="gvv"+num2str(3*(vn1-1)+1) g_val2="gvv"+num2str(3*(vn1-1)+2) g_val3="gvv"+num2str(3*(vn1-1)+3) //トレースのXウェーブ、Yウェーブを宣言 wave wx=CsrxWaveRef(A,gwname) wave wy=CsrWaveRef(A,gwname) variable/g root:POPEN:$g_val0=pcsr(A) variable/g root:POPEN:$g_val1=wy[pcsr(A)] //グローバル変数に格納 variable/g root:POPEN:$g_val2=wx[pcsr(A)] if(wx[0]>10) //nmであると認識 variable/g root:POPEN:$g_val3=10 //半値幅 else //eVであると認識 variable/g root:POPEN:$g_val3=0.02 //半値幅 endif //タグの設定 string tgname="tag"+num2str(vn1) tag/w=$gwname/c/n=$tgname/l=2/X=0.00/Y=20.00 $tname,pcsr(A),num2str(vn1) //黒塗り部分を削除 set_vis(0,1,1) //カーソルを元に戻す cursor/p/w=$gwname A $tname pA cursor/p/w=$gwname B $tname pB //「取得」ボタン、説明テキストを削除する KillControl/w=$gwname but_G killcontrol/w=$gwname tib_exp1 killcontrol/w=$gwname tib_exp2 //panelAを最前面へ dowindow/f panelA //「参照」ボタンを復活させる Button button_get win=panelA,title="参照",disable=0 Button button_get win=panelA,help={"グラフウィンドウに戻り、値を取得します。"} //表示をもとにもどす //visible(1) //旧処理関数。変更↓ panelA_able(1) //「Fitting」ボタンをpanelAに作成する button button_make_fw win=panelA,disable=0 //「ベース値」可変表示窓を作成する variable/g base //グローバル変数宣言 SetVariable ctrBase win=panelA,disable=0,labelBack=(60416,59648,55296),noedit=0,value=base //(2003.5.19追加) //ベースを保持するかどうかチェックボタンを追加する checkbox rbox_baseOn,win=panelA,disable=0 //「軽く表示する」ボタンを追加する Button but_visble,win=panelA,disable=0 end //従属関数 function rboxbaseOnOff(ctrlName,checked) : CheckBoxControl //ベース保持のラジオボタンが押されたとき、反転動作する string ctrlName variable checked variable/G base_checked //記憶用 variable/G base_checked_pre if(base_checked_pre==0) print "off→on",base_checked,base_checked_pre checkbox rbox_baseOn,Value=1 base_checked=0 base_checked_pre=1 else print "on→off",base_checked,base_checked_pre checkbox rbox_baseOn,Value=0 base_checked=1 base_checked_pre=0 endif end //****************************************************************************************************** function make_fw(ctrlName) : buttoncontrol //panelAより「Fitting」が押されたときの処理 string ctrlName variable vn1=1 string/g gwname string cbxname //チェックボックスコントロール名を保持 string v_topIn,v_posit,v_width //可変表示窓のコントロール名を保持 variable vtemp=0 //入力されている行数を保持 variable v2=0 //スイッチ string text //アラートウィンドウに表示するテキスト vn1=1 //チェックボックスにチェックされている行に正しい数値が入力されているかを確認 do cbxname="cbox"+num2str(vn1)+"a" //チェックボックス名 v_topIn="Sval"+num2str(vn1)+"_topIn" //可変表示窓コントロール名 if(check_ctr(cbxname)==1) //チェックボックスがONのとき if(get_ctr_val(v_TopIn)==0) //値が「0」のとき v2=-1 else //値を持つとき vtemp=vtemp+1 endif endif vn1=vn1+1 while(vn1<10) if(v2==-1) //以下を表示させて終了させる print "要素が「0」のデータがあります。チェックをはずか、もしくは値を入力してください。" else //fwウェーブの作成(3*vtemp+1の要素をもつ) //print vtemp //値がセットされている行がいくつあるかを示す //fwウェーブがいくつのガウシアン関数で近似されるかをアラートプロンプトで示す。 text=num2str(vtemp)+"個のガウシアン関数で近似します。" DoAlert 1,text if(V_flag==1) //「yes」が押されたとき //要素数(3*vtemp+1)ウェーブの作成 make/D/O/N=(3*vtemp+1) fw //データフォルダroot:POPENに編集中のウェーブをコピーする string/G xWavName string/G yWavName string xwave="copy_"+xWavName string ywave="copy_"+yWavName //print xwave,ywave vn1=1 variable v3 //v3番目のガウシアン関数 v3=1 do v_topIn="Sval"+num2str(vn1)+"_topIn" //可変表示窓コントロール名 v_posit="Sval"+num2str(vn1)+"_posit" v_width="Sval"+num2str(vn1)+"_width" if(get_ctr_val(v_TopIn)!=0) //「0」以外の値を持つとき //fwに入力していく print v_topin,get_ctr_val(v_topin),(v3-1)+0 fw[(v3-1)*3+0]=get_ctr_val(v_topin) print v_posit,get_ctr_val(v_posit),(v3-1)+1 fw[(v3-1)*3+1]=get_ctr_val(v_posit) print v_width,get_ctr_val(v_width),(v3-1)+2 fw[(v3-1)*3+2]=get_ctr_val(v_width) v3=v3+1 endif vn1=vn1+1 while(vn1<10) //最後にベース値を入力 variable/g base fw[3*vtemp]=base //(2003.5.19追加) //ベースを保持するかどうか指定する variable baseon baseon=get_ctr_val("rbox_baseOn") //情報を取得 //フィッティングを施す fit_fw(vtemp,xwave,ywave,baseon) //フィッティング後の係数値を再び表示する //グローバル変数を使用するため宣言 string g_val1,g_val2,g_val3 //グローバル変数に用いる名前を保持する変数 vn1=1 do g_val1="gvv"+num2str(3*(vn1-1)+1) g_val2="gvv"+num2str(3*(vn1-1)+2) g_val3="gvv"+num2str(3*(vn1-1)+3) variable/g root:POPEN:$g_val1=fw[3*(vn1-1)+0] //グローバル変数に代入 variable/g root:POPEN:$g_val2=fw[3*(vn1-1)+1] variable/g root:POPEN:$g_val3=fw[3*(vn1-1)+2] vn1=vn1+1 while(vn1=9) print "error:9つ以上のウェーブのパッキングはできません。これ以上、パッキングできません。" else //さらに、リスト中にすでに同じ要素が存在するとエラーを返す。 if(FindListItem(popstr,GS_listname)!=-1) //同じ名前が存在する print "error:同じ係数ウェーブはパッキングできません。" else //GS_listnameに追加して、GV_samに+1する GS_listname=GS_listname+popStr+";" GV_sam=GV_sam+1 refresh_V(ItemsInList(GS_listname,";")) DrawLine 30,192+16*10,375,192+16*10 //「やり直し」「名前を付けてパッキング」ボタンの表示 Button button_elase,pos={60,185+16*11},size={50,18},proc=But_elase,title="やり直し" Button button_elase,help={"選択した項目を一度削除します。"} button button_save_CF,pos={150,185+16*11},size={160,18},proc=But_packing_CF,title="名前を付けてパッキング",disable=0 Button button_save_CF,help={"以上の係数ウェーブを新たに名前を付けてパッキングします。"} endif endif End function refresh_V(now_selected) //GS_listnameから情報を抜き取り表示する variable now_selected variable/G GV_num=now_selected //どの係数ウェーブが選択されているかを保持 variable/G GV_sam //いくつのウェーブを合成するか、その量を保持 string/G GS_listname //合成される係数ウェーブのリストを保持 //グローバル変数の変数名を保持する変数 string gv_selx string vname //可変表示窓のコントロール名を保持 GV_sam=ItemsInList(GS_listname,";") //合計いくつの係数ウェーブを合成するのか取得 //表示を更新させる variable v1=1 do gv_selx="GS_sel"+num2str(v1) vname="textwin"+num2str(v1) if(v1<=GV_sam) //リストの要素数まで string/G $gv_selx=StringFromList(v1-1,GS_listname,";") SetVariable $vname title=" ",value= $gv_selx,limits={-inf,inf,0} SetVariable $vname pos={60,185+16*v1},size={250,250},disable=0,frame=0 SetVariable $vname labelBack=(65535,65535,65535),noedit=1 else //リストにない項目は string/G $gv_selx=" " setvariable $vname title=" ",value= $gv_selx,limits={-inf,inf,0},pos={60,185+16*v1},disable=0 SetVariable $vname size={250,250},labelBack=(60416,59648,55296),frame=0,noedit=1 endif v1=v1+1 while(v1<10) end But_elase function But_elase(ctrlName) : buttoncontrol //「やりなおし」ボタンがクリックされた時 string ctrlname variable/G GV_sam=0 //いくつのウェーブを合成するか、その量を保持 string/G GS_listname="" //合成される係数ウェーブのリストを保持 string gv_selx //グローバル変数の変数名を保持する変数 string vname //可変表示窓のコントロール名を保持 //表示を更新させる variable v1=1 do gv_selx="GS_sel"+num2str(v1) string/G $gv_selx="" vname="textwin"+num2str(v1) setvariable $vname title=" ",value= $gv_selx,limits={-inf,inf,0},pos={60,185+16*v1},disable=0 SetVariable $vname size={250,250},labelBack=(60416,59648,55296),frame=0,noedit=1 v1=v1+1 while(v1<10) //「名前を付けてパッキング」を選択不可に button button_save_CF,noproc,disable=2 end function But_packing_CF(ctrlName) : buttoncontrol //「名前をつけてパッキング」ボタンがクリックされた時 string ctrlname //グローバル変数より、いくつの係数ウェーブをパッキングするのか?、それぞれにつき、いくつのピークをもっているのか?を調べる。 string/G GS_listname //係数ウェーブ名のリスト variable/G GV_sam //いくつの係数ウェーブ名をパッキングするのか保持 string now_cf //現在編集中の係数ウェーブ名を保持(リストn番目) variable v1 //ループ変数(現在編集中の係数ウェーブがリストの何番目であるかを保持(リストv1番目)) variable w_number //現在編集中の係数ウェーブにおける、ピークの数を保持 variable ew_number //最終的に合成される係数ウェーブの、ピークの数を保持 variable v2 =0 //いくつピークがあったのか、ヒストリを記録する。 string text //アラートで表示する文章を保持 string s1 //まず、作成するウェーブのポイント数を決定したい v1=1 do now_cf=StringFromList(v1-1,GS_listname,";") //係数ウェーブリストのはじめから、v1番目の要素(文字列)を抜き取る wave w1=$now_cf //ウェーブとして認識 w_number=(numpnts(w1)-1)/3 if((w_number-round(w_number))!=0) //ウェーブが規格外のとき v2=-1 v1=GV_sam else v2=w_number+v2 endif v1=v1+1 while(v1